/*
 * Project Name : NOBUNAGA
 * Created on 2007/04/05
 *http://livedocs.adobe.com/flex/201_jp/langref/mx/charts/chartClasses/Series.html
 */
package jp.sengoku.oda
{
	import mx.charts.chartClasses.Series;
	import mx.charts.chartClasses.LegendData;
	import mx.core.UIComponent;
	import flash.geom.Point;
	import mx.charts.chartClasses.ChartElement;
	import flash.events.MouseEvent;
	import mx.charts.HitData;
	import mx.charts.ChartItem;
	import flash.display.Shape;
	
	/** レーダチャート用のSeriesクラス
	 * @author u102379@gmail.com
	 */	
	public class TakigawaSeries extends Series
	{
		//チャートアイテム
		private var chartPointItems:Array;

		//データポイントの 位置を決定するデータプロバイダのフィールドを指定
		public var field:String;

		//存在しないデータの表現方法
		public var interpolateValues:Boolean = false;
		
		//データポイントのグラフエレメントの半径をピクセル単位で指定
		public var radius:Number=0;

		//ラインカラー
		public var lineColor:uint;

		//チャート要素のオブジェクト：グラフデータとして
        private var chartEle:Shape = new Shape();
        
		/** コンストラクタでござる
		 */
		public function TakigawaSeries() {
			super();
			
		}
        
   		/** 要素オブジェクトの削除を行う。
		 * @return void
		 */
		public function removeSeriesElement():void{
			removeChild(chartEle);
			chartEle = null;
			chartEle = new Shape()
			
			for(var i:Number=0; i<chartPointItems.length; i++){
				removeChild(chartPointItems[i].element);
				chartPointItems[i] = null;
			}
			chartPointItems = null;

		}

		/** チャート要素の作成
		 * @return void
		 */
		public function createChartElement():void{
			var points:Point;
			var tChart:TakigawaChart = TakigawaChart(chart);
			if(chartPointItems != null )
				chartPointItems = null;
			chartPointItems = new Array(0);
			
			//チャート要素のラインスタイルを設定する
			chartEle.graphics.lineStyle(3, lineColor, 1);
			for(var j:Number=0; j< tChart.NumberOfDimension; j++){
				//軸上の座標を取得
				points = getDataPoint(j);
				//線を引く
				if(j!=0){
					chartEle.graphics.lineTo(points.x, points.y);
				}
				chartEle.graphics.moveTo(points.x, points.y);
				
				var pointEle:ChartElement = new ChartElement();
				pointEle.graphics.beginFill(lineColor, 1);
				pointEle.graphics.drawCircle(points.x,points.y, radius);
				var pointItem:ChartItem = new ChartItem(pointEle,dataProvider[j],j)
				this.addChild(pointEle);
				chartPointItems.push(pointItem);
			}
			points = getDataPoint(0);
			chartEle.graphics.lineTo(points.x, points.y);
			this.addChild(chartEle);
			
		}

		
		/** 指定されたデータのグローバル座標を返す
		 * @param dataProviderIndex	データプロバイダの対象インデックス
		 */		 
		private function getDataPoint(dataProviderIndex:Number):Point{
			var tChart:TakigawaChart = TakigawaChart(chart);
			
			if(dataProvider[dataProviderIndex].hasOwnProperty(field)==true){
				//要素データ
				var dataValue:Number = Number(dataProvider[dataProviderIndex][field]);
				return tChart.dataToGlobal(dataProviderIndex, dataValue);
			}else{
				return tChart.dataToGlobal(0, 0);
			}
		}

		/**凡例取得のためのメソッド（Override）
		 * 凡例データを配列で返す
		 */
		public override function get legendData():Array {
			//凡例オブジェクトの定義
			var markerObj:UIComponent = new UIComponent()
			markerObj.graphics.beginFill(lineColor, 1);
			markerObj.graphics.drawRect(0,2,5,10);

			var legDataArray:Array = new Array(0);
			var legData:LegendData = new LegendData();
			legData.label = this.displayName;
			legData.marker = markerObj;
			legDataArray.push(legData);

			return legDataArray;
		}

		/**指定された座標にあるエレメントによって表される最も近いデータポイントを探します。 
		 * Override関数
		 * @param x				X 座標を表します
		 * @param y				Y 座標を表します
		 * @param sensitivity2	実際の座標に対してどこまでの範囲内であれば、座標の下にあると見なされるかをピクセル単位
		 * @return 
		 */
		public override function findDataPoints(inputX:Number, inputY:Number, sensitivity2:Number):Array{
			var result:Array = [];		//結果として返す配列
			var targetElem:ChartElement;//ターゲットのチャートエレメント
			var targetItem:ChartItem;	//ターゲットのチャートアイテム
			var inputPoint:Point = new Point(inputX, inputY);			//指定された座標
			var globalPoint:Point = chart.contentToGlobal(inputPoint);	//指定された座標（グローバル座標）
			var dataPoint:Point;	//ターゲットデータのグローバル座標
			var tChart:TakigawaChart = chart as TakigawaChart;	//親チャートのオブジェクト

			//このSeriesが保持しているChildの数だけ繰り返す
			for (var i:int = numChildren - 1; i >= 0; i--){
				//ターゲットのエレメントを取得し、有効か否かをチェックする
				targetElem = getChildAt(i) as ChartElement;
				if (targetElem == null || targetElem.visible == false){
					continue;
				}

				//ターゲットエレメントが指定された座標下にあるかチェックする
				if( targetElem.hitTestPoint(globalPoint.x, globalPoint.y, true) == true){
					//ターゲットのチャートアイテムを取得する
					targetItem=null;
					for(var j:Number=0; j < chartPointItems.length; j++){
						if( targetElem.name == chartPointItems[j].element.name){
							targetItem = chartPointItems[j];
							continue;
						}
					}
					if( targetItem == null )
						continue;

					//ターゲットデータのグローバル座標を取得する					
					var targetItemValue:Number = dataProvider[targetItem.index][this.name];
					if(isNaN(targetItemValue))
						targetItemValue = 0;
					dataPoint = tChart.dataToGlobal( targetItem.index, targetItemValue )

					result = result.concat(new HitData(0,0, dataPoint.x, dataPoint.y, targetItem));
				}
			}
			return result;
		}

	}
}
